//********************************************************************************************************************//
//ORGANIZATION:
//AUTHOR: bpeng(bogers.peng@gmail.com)
//SUMMARY:
//********************************************************************************************************************//
#ifndef NATIVE_SYSTEM_BASE_CASE_H
#define NATIVE_SYSTEM_BASE_CASE_H

#ifndef NATIVE_SYSTEM_BASE_SCENE_H
#include "System/Base/Scene.h"
#endif

namespace Native { namespace System
{
    //****************************************************************************************************************//
    //CCase
    //
    //****************************************************************************************************************//
    NATIVE_DECLARE_CONST_OBJECT(CCase, C_CASE);
    class NATIVE_LIBRARY_EXPORT CCase :
        public CObject,
        public IEqualTo<CCase>
    {
        NATIVE_DECLARE_OBJECT;
        
        NATIVE_DECLARE_PROPERTY(public, public, CScene, Scene, _scene);
        NATIVE_DECLARE_PROPERTY(public, public, wstring, Message, _message);
        NATIVE_DECLARE_PROPERTY(public, public, wstring, Arguments, _arguments);
        NATIVE_DECLARE_PROPERTY(public, public, wstring, Detail, _detail);

    public:
        const static size_t MAX_MESSAGE_LENGTH = 4*1024;

    public:
        CCase();
        CCase(C_CASE& that);
        CCase(C_CASE&& that);
        CCase(
            C_SCENE& scene,
            WSTRING& message,
            WSTRING& arguments = EMPTY_STRING,
            WSTRING& detail = EMPTY_STRING);

    public:
        //CObject
        virtual wstring ToString() const;
        //IEqualTo
        virtual bool operator==(C_CASE& rvalue) const;
        virtual bool operator!=(C_CASE& rvalue) const;

        C_CASE& operator=(C_CASE& rvalue);
    };
}}

#endif